const Router = require('koa-router');
const router = new Router();
const fs = require('await-fs');
const path = require('path');
const common = require('../../libs/common');



router.get('/login', async ctx => {
    // 每次get请求时,无论是第一次还是请求失败重定向到login的,都要返回前端一些数据,
    // 当用户登录出错,post请求的错误处理是重定向到login,并且url中带上errmsg的信息 
    // 此处就可以获取url中的query信息, 然后把query中相关的重要信息, 当作参数传递给模板引擎ejs,用于判断是否显示错误信息div
    // HTTP_ROOT或者是否有错误err
    await ctx.render('admin/login', {
        HTTP_ROOT: ctx.config.HTTP_ROOT,
        errmsg: ctx.query.errmsg
    });
});
router.post('/login', async ctx => {
    // 从ctx中获取路径信息 
    const HTTP_ROOT = ctx.config.HTTP_ROOT;
    // 1. 获取表单数据 (user,password是form表单中input标签的name属性)
    let { username, password } = ctx.request.fields;
    // 2. 读取文件记录的管理员信息 (Array)
    let admins = JSON.parse(
        (await fs.readFile(path.resolve(__dirname, '../../admins.json'))).toString()
    );
    
    // 3. 封装一个函数, 查找admin登录的用户是否是管理员, 是就返回管理员在配置文件中的信息, 不是就return null
    /*
    function findAdmin (username) {
        let res = null;
        admins.forEach(admin => {
            if (admin.username == username) {
                res = admin;
            }
        });
        return res;
    }
    */
    function findUser (user) {
        let res = null;
        for (let admin of admins) {
            if (admin.username == user) {
                res = admin;
            }
        }
        return res;
    }
    // 4. 查找用户是否存在 
    let admin = findUser(username);

    // 5. 不存在, 页面重定向到login页面,并提供errmsg, 用于判断是否显示错误信息提示框
    if (!admin) {
        // ctx.redirect(`${HTTP_ROOT}/admin/login?errmsg='用户不存在'`);
        ctx.redirect(`${HTTP_ROOT}/admin/login?errmsg=${encodeURIComponent('用户不存在')}`);
    } else if (admin.password != common.md5(password + ctx.config.ADMIN_SALT)){
        ctx.redirect(`${HTTP_ROOT}/admin/login?errmsg=${encodeURIComponent('密码不对')}`);
    } else {
        // 登录成功,在session中设置admin字段,用于判断是否为管理员
        ctx.session.admin = username;
        ctx.redirect(`${HTTP_ROOT}/admin/`);
    }

});

// 登录成功之后,每次访问后台路径,都需要校验管理员身份(权限)
router.all('*', async (ctx, next) => {
    let { HTTP_ROOT } = ctx.config;
    if (ctx.session.admin) {
        await next();
    } else {
        ctx.redirect(`${HTTP_ROOT}/admin/login`);
    }
});

// 当输入的地址是根路径的时候(相对admin路径, 即localhost:8080/admin --->localhost:8080/admin/banner ),
// 默认重定向到类似首页的地址
router.get('/', async ctx => {
    const { HTTP_ROOT } = ctx.config;
    ctx.redirect(`${HTTP_ROOT}/admin/banner`);
})

// banner路由分支
router.use('/banner', require('./banner.js'));
router.use('/catalog', require('./catalog.js'));
router.use('/article', require('./article.js'));


module.exports = router.routes();